package practice;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;

/*
    程序执行不出来？？？？？？？？？？？？？

    反射练习：写一个“框架”，在不改变任意代码的前提下（不再通过以前的创建对象的方法），可以帮我们创建任意类的对象，并执行其中任意的方法
    实现要求：1.配置文件：创建有一个New File文件,文件命名以.properties结尾
             2.反射

    实现步骤：1.将需要创建的对象的全类名(包名.类名)和需要执行的方法（方法名 ）定义在配置文件中
             2.在程序中加载读取配置文件
             3.使用反射技术来加载文件进内存
             4.创建对象
             5.执行方法
 */
public class PracticeMain {
    public static void main(String[] args) throws  Exception {
        //2.在程序中加载读取配置文件
        /*
            步骤：1.创建 Properties对象，从而使用其中的load()方法将需要的数据读取到内存中，形成一个集合
                 2.使用类加载器(getClassLoader())将class中的数据加载到内存中，从而找到并使用配置文件
                 3.获取配置文件中定义的数据:getProperty()

         */
        //创建 Properties对象
        Properties pro = new Properties();
        //使用类加载器(getClassLoader())将class中的数据加载到内存中
        ClassLoader classLoader = PracticeMain.class.getClassLoader();//当前类名.class.getClassLoader(),返回ClassLoader
        //获取资源对应的字节流，并直接返回字节流
        InputStream is = classLoader.getResourceAsStream("reflect.properties");//获取配置文件
        pro.load(is);//将配合文件的字节流加载到内存中，有异常抛出
        //获取配置文件中定义的数据
        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");

        // 3.使用反射技术来加载文件进内存
        //获取Class对象，将className类加载进内存
        Class aClass = Class.forName(className);
        //获取构造方法，用来创建对象
        Constructor constructor = aClass.getConstructor();
        //使用构造器创建对象
        Object o = constructor.newInstance();
        ///获取无参成员方法
        Method method = aClass.getMethod("methodName");//传入方法名
        //执行对象中的方法
        method.invoke(o);



    }

}
